# -.- coding: utf-8 -.-

from django.shortcuts import render_to_response
from fichas.models import *
from django.template import RequestContext
from django.contrib.auth.decorators import login_required
from django.http import HttpResponseRedirect
#from fichas.forms import VentajasForm, DesventajasForm, HabilidadSecForm
from django.core.urlresolvers import reverse

#VISTA EN PRUEBAS
@login_required
def ficha(request, personaje=None, paso=None, formulario=None, template_name='gestor/formulario.html', extra_context={}):
    #esto es para mostrar las fichas en el margen
    elem = None
    diccionario = {}
    form = None
    info_ficha = {} #diccionario para q en el paso de las ventajas y siempre q se usen manytomanyfields podamos pasarle info necesaria (x ej. las ventajas q ya ha elegido)

    if request.user.is_authenticated():
        jug = Jugador.objects.get(jugador=request.user)
        if personaje:
            laficha = FichaAnima.objects.get(propietario=jug, personaje=personaje)
        else:
            laficha = None
    
    if request.method == 'POST':
        if paso is None:
            form = formulario(propietario=request.user.username, data=request.POST)
        else:
            form = formulario(propietario=request.user.username, personaje=personaje, data=request.POST)
        if form.is_valid():
            mipj=form.save()
            #CASUISTICAS:
                #si entramos en la url "nuevaficha/" (no hay parametro "paso" ni parametro "personaje")
                    #necesitamos el nombre del personaje extraido del formulario (elemento "mipj") y regenerarnos una url al paso 1
                #si entramos en la url "personaje/<pj>/" (no hay parametro "paso", pero si parametro "personaje")
                    #simplemente entramos desde la url actual a la "paso1"
                #si entramos en la url "personaje/<pj>/paso1" (hay tanto parametro "paso", com parametro "personaje")
                    #incrementamos el paso al paso siguiente
            if paso is None:
                if personaje is None:
                    return HttpResponseRedirect(reverse('paso1', args=[mipj]))
                else:
                    return HttpResponseRedirect(reverse('paso1', args=[personaje]))
            elif paso == 0: #el paso 0 es igual que si no hay paso, para que avance al siguiente paso
                return HttpResponseRedirect(reverse('paso1', args=[personaje]))
            else:   #en el resto de pasos, prefiero que se quede en el mismo paso al guardar para ver los cambios
                return HttpResponseRedirect(reverse('paso%d' % paso, args=[personaje]))
                
    #si vamos a mostrar la ficha de primeras, y nos interesa reutilizar el formulario
    #para que tambien podamos mostrar fichas creadas previamente, lo mejor es seguir este
    #proceso:
    else:
        try:
            #si existe una ficha sin validar para el personaje en cuestion, la extrae y
            #la muestra al usuario
            elem = FichaAnimaSinValidar.objects.get(propietario=jug, personaje=personaje)
            for attr, value in elem.__dict__.iteritems():
                diccionario[attr] = value
        except FichaAnimaSinValidar.DoesNotExist:
            try:
                #si no existe una ficha sin validar, pero si que existe una validada
                #para el pj en cuestion, se extrae y se muestra al usuario
                elem = FichaAnima.objects.get(propietario=jug, personaje=personaje)
                for attr, value in elem.__dict__.iteritems():
                    diccionario[attr] = value
            except FichaAnima.DoesNotExist:
                #si no existe ninguna ficha para ese personaje, se lanza un formulario
                #vacio para que se cree nueva la ficha con el nombre que se quiere
                if paso is None:
                    #NUEVA RESTRICCION: si algun listillo llama a una url del tipo:
                    # .../gestor/<pj_no_existente>/paso<elquesea>/
                    #lo debe redireccionar a la pantalla inicial de creacion de ficha, puesto
                    #que no debe poder crear una ficha empezando por un paso distinto al inicial
                    diccionario['personaje'] = personaje
                else:
                    #con esto, al intentar lo que he explicado arriba, se redirecciona
                    #automaticamente a
                    #.../gestor/<pj_no_existente>/
                    #el cual ya se encarga de hacerle una fichita nueva con sus datos vacios
                    #return HttpResponseRedirect('../')
                    return HttpResponseRedirect(reverse('paso0', args=[personaje]))
        
        if paso is None:
            form = formulario(propietario=request.user.username, initial=diccionario)
        else:
            info_ficha['personaje'] = elem.personaje
            if paso == 3:
                info_ficha['vent_fijas'] = elem.ventajas.all()
                info_ficha['desvent_fijas'] = elem.desventajas.all()
                info_ficha['vent_prop'] = elem.ventajas_prop.all()
                info_ficha['desvent_prop'] = elem.desventajas_prop.all()
            else:
                form = formulario(propietario=request.user.username, personaje=personaje, initial=diccionario)
                if paso == 4:
                    info_ficha['hab_esp'] = elem.especiales.all()
                elif paso == 5:
                    info_ficha['armas'] = elem.armas.all()
    return render_to_response(template_name,{'tipoform':"ficha", 'form':form, 'info_ficha':info_ficha, 'laficha':laficha}, context_instance=RequestContext(request))

@login_required
def borra_ficha(request, personaje, extra_context={}):
    if request.user.is_authenticated():
        jug = Jugador.objects.get(jugador=request.user)
        #NOTA DE DISEÑO: HABRIA QUE PONER UNA RESTRICCION DE FORMA QUE NO SE PUEDA
        #BORRAR UNA FICHA SI ESTA PARTICIPANDO EN UNA PARTIDA
        #del tipo:
        #if not FichaAnima.objects.get(propietario=jug, personaje=personaje).partida:
        try:
            fsvborrar = FichaAnimaSinValidar.objects.get(propietario=jug, personaje=personaje)
            FichaAnimaSinValidar.delete(fsvborrar)
        except FichaAnimaSinValidar.DoesNotExist:
            pass
        try:
            borrar = FichaAnima.objects.get(propietario=jug, personaje=personaje)
            FichaAnima.delete(borrar)
        except FichaAnima.DoesNotExist:
            pass

    return render_to_response('inicial.html',extra_context, context_instance=RequestContext(request))


@login_required
def nueva_ventaja(request, personaje):
    if request.user.is_authenticated():
        prop = Jugador.objects.get(jugador=request.user)
    
    if request.method == 'POST':
        form = VentajasForm(data=request.POST)
        if form.is_valid():
            form.save_propietario(jugpropietario=prop)
        return HttpResponseRedirect(reverse('lista_ventajas_prop', args=[personaje]))
    else:
        form = VentajasForm()
    return render_to_response('gestor/formulario_ventdesv.html',{'form':form}, context_instance=RequestContext(request))

@login_required
def nueva_desventaja(request,personaje):
    if request.user.is_authenticated():
        prop = Jugador.objects.get(jugador=request.user)
    
    if request.method == 'POST':
        form = DesventajasForm(data=request.POST)
        if form.is_valid():
            form.save_propietario(jugpropietario=prop)
        return HttpResponseRedirect(reverse('lista_desventajas_prop', args=[personaje]))
    else:
        form = DesventajasForm()
    return render_to_response('gestor/formulario_ventdesv.html',{'form':form}, context_instance=RequestContext(request))

@login_required
def nueva_hab_esp(request, personaje):
    if request.user.is_authenticated():
        prop = Jugador.objects.get(jugador=request.user)
    
    if request.method == 'POST':
        form = HabilidadSecForm(data=request.POST)
        if form.is_valid():
            form.save_propietario(jugpropietario=prop)
        return HttpResponseRedirect(reverse('lista_hab_esp', args=[personaje]))
    else:
        form = HabilidadSecForm()
    return render_to_response('gestor/formulario_habsec.html',{'form':form}, context_instance=RequestContext(request))


@login_required
def listar_ventajas(request, personaje):
    if request.user.is_authenticated():
        prop = Jugador.objects.get(jugador=request.user)
        ficha_jugador = FichaAnima.objects.get(propietario=prop, personaje=personaje)
        lista_elegidas = ficha_jugador.ventajas.all()
        pj = ficha_jugador.personaje
    lista = VentajasFijas.objects.all()
    return render_to_response('gestor/listado.html',{'lista':lista, 'lista_elegidas':lista_elegidas, 'pj':pj, 'tipo':"ventaja"}, context_instance=RequestContext(request))

@login_required
def elegir_ventaja(request, personaje, ventaja_id):
    if request.user.is_authenticated():
        prop = Jugador.objects.get(jugador=request.user)
        ficha_jugador = FichaAnima.objects.get(propietario=prop, personaje=personaje)
        la_ventaja = VentajasFijas.objects.get(id=ventaja_id)
        ficha_jugador.ventajas.add(la_ventaja)
        ficha_jugador.save()
    return HttpResponseRedirect(reverse('lista_ventajas', args=[personaje]))

@login_required
def quitar_ventaja(request, personaje, ventaja_id):
    if request.user.is_authenticated():
        prop = Jugador.objects.get(jugador=request.user)
        ficha_jugador = FichaAnima.objects.get(propietario=prop, personaje=personaje)
        la_ventaja = VentajasFijas.objects.get(id=ventaja_id)
        ficha_jugador.ventajas.remove(la_ventaja)
        ficha_jugador.save()
    return HttpResponseRedirect(reverse('lista_ventajas', args=[personaje]))


@login_required
def listar_ventajas_prop(request, personaje):
    if request.user.is_authenticated():
        prop = Jugador.objects.get(jugador=request.user)
        ficha_jugador = FichaAnima.objects.get(propietario=prop, personaje=personaje)
        lista_elegidas = ficha_jugador.ventajas_prop.all()
        pj = ficha_jugador.personaje
    lista = VentajasDependientes.objects.filter(propietario=prop)
    return render_to_response('gestor/listado.html',{'lista':lista, 'lista_elegidas':lista_elegidas, 'pj':pj, 'tipo':"vent_propia"}, context_instance=RequestContext(request))
    
@login_required
def elegir_ventaja_prop(request, personaje, ventaja_id):
    if request.user.is_authenticated():
        prop = Jugador.objects.get(jugador=request.user)
        ficha_jugador = FichaAnima.objects.get(propietario=prop, personaje=personaje)
        la_ventaja = VentajasDependientes.objects.get(id=ventaja_id)
        ficha_jugador.ventajas_prop.add(la_ventaja)
        ficha_jugador.save()
    return HttpResponseRedirect(reverse('lista_ventajas_prop', args=[personaje]))

@login_required
def quitar_ventaja_prop(request, personaje, ventaja_id):
    if request.user.is_authenticated():
        prop = Jugador.objects.get(jugador=request.user)
        ficha_jugador = FichaAnima.objects.get(propietario=prop, personaje=personaje)
        la_ventaja = VentajasDependientes.objects.get(id=ventaja_id)
        ficha_jugador.ventajas_prop.remove(la_ventaja)
        ficha_jugador.save()
    return HttpResponseRedirect(reverse('lista_ventajas_prop', args=[personaje]))


@login_required
def listar_desventajas(request, personaje):
    if request.user.is_authenticated():
        prop = Jugador.objects.get(jugador=request.user)
        ficha_jugador = FichaAnima.objects.get(propietario=prop, personaje=personaje)
        lista_elegidas = ficha_jugador.desventajas.all()
        pj = ficha_jugador.personaje
    lista = DesventajasFijas.objects.all()
    return render_to_response('gestor/listado.html',{'lista':lista, 'lista_elegidas':lista_elegidas, 'pj':pj, 'tipo':"desventaja"}, context_instance=RequestContext(request))

@login_required
def elegir_desventaja(request, personaje, desventaja_id):
    if request.user.is_authenticated():
        prop = Jugador.objects.get(jugador=request.user)
        ficha_jugador = FichaAnima.objects.get(propietario=prop, personaje=personaje)
        la_desventaja = DesventajasFijas.objects.get(id=desventaja_id)
        ficha_jugador.desventajas.add(la_desventaja)
        ficha_jugador.save()
    return HttpResponseRedirect(reverse('lista_desventajas', args=[personaje]))

@login_required
def quitar_desventaja(request, personaje, desventaja_id):
    if request.user.is_authenticated():
        prop = Jugador.objects.get(jugador=request.user)
        ficha_jugador = FichaAnima.objects.get(propietario=prop, personaje=personaje)
        la_desventaja = DesventajasFijas.objects.get(id=desventaja_id)
        ficha_jugador.desventajas.remove(la_desventaja)
        ficha_jugador.save()
    return HttpResponseRedirect(reverse('lista_desventajas', args=[personaje]))

@login_required
def listar_desventajas_prop(request, personaje):
    if request.user.is_authenticated():
        prop = Jugador.objects.get(jugador=request.user)
        ficha_jugador = FichaAnima.objects.get(propietario=prop, personaje=personaje)
        lista_elegidas = ficha_jugador.desventajas_prop.all()
        pj = ficha_jugador.personaje
    lista = DesventajasDependientes.objects.filter(propietario=prop)
    return render_to_response('gestor/listado.html',{'lista':lista, 'lista_elegidas':lista_elegidas, 'pj':pj, 'tipo':"desvent_propia"}, context_instance=RequestContext(request))
    
@login_required
def elegir_desventaja_prop(request, personaje, desventaja_id):
    if request.user.is_authenticated():
        prop = Jugador.objects.get(jugador=request.user)
        ficha_jugador = FichaAnima.objects.get(propietario=prop, personaje=personaje)
        la_desventaja = DesventajasDependientes.objects.get(id=desventaja_id)
        ficha_jugador.desventajas_prop.add(la_desventaja)
        ficha_jugador.save()
    return HttpResponseRedirect(reverse('lista_desventajas_prop', args=[personaje]))

@login_required
def quitar_desventaja_prop(request, personaje, desventaja_id):
    if request.user.is_authenticated():
        prop = Jugador.objects.get(jugador=request.user)
        ficha_jugador = FichaAnima.objects.get(propietario=prop, personaje=personaje)
        la_desventaja = DesventajasDependientes.objects.get(id=desventaja_id)
        ficha_jugador.desventajas_prop.remove(la_desventaja)
        ficha_jugador.save()
    return HttpResponseRedirect(reverse('lista_desventajas_prop', args=[personaje]))


@login_required
def listar_hab_esp(request, personaje):
    if request.user.is_authenticated():
        prop = Jugador.objects.get(jugador=request.user)
        ficha_jugador = FichaAnima.objects.get(propietario=prop, personaje=personaje)
        lista_elegidas = ficha_jugador.especiales.all()
        pj = ficha_jugador.personaje
    lista = HabilidadesSecundariasDependientes.objects.filter(propietario=prop)
    return render_to_response('gestor/listado.html',{'lista':lista, 'lista_elegidas':lista_elegidas, 'pj':pj, 'tipo':"hab_esp"}, context_instance=RequestContext(request))

@login_required
def elegir_hab_esp(request, personaje, hab_id):
    if request.user.is_authenticated():
        prop = Jugador.objects.get(jugador=request.user)
        ficha_jugador = FichaAnima.objects.get(propietario=prop, personaje=personaje)
        la_hab = HabilidadesSecundariasDependientes.objects.get(id=hab_id)
        ficha_jugador.especiales.add(la_hab)
        ficha_jugador.save()
    return HttpResponseRedirect(reverse('lista_hab_esp', args=[personaje]))

@login_required
def quitar_hab_esp(request, personaje, hab_id):
    if request.user.is_authenticated():
        prop = Jugador.objects.get(jugador=request.user)
        ficha_jugador = FichaAnima.objects.get(propietario=prop, personaje=personaje)
        la_hab = HabilidadesSecundariasDependientes.objects.get(id=hab_id)
        ficha_jugador.especiales.remove(la_hab)
        ficha_jugador.save()
    return HttpResponseRedirect(reverse('lista_hab_esp', args=[personaje]))

@login_required
def listar_armas(request, personaje):
    if request.user.is_authenticated():
        prop = Jugador.objects.get(jugador=request.user)
        ficha_jugador = FichaAnima.objects.get(propietario=prop, personaje=personaje)
        lista_elegidas = ficha_jugador.armas.all()
        pj = ficha_jugador.personaje
    lista = Arma.objects.all()
    return render_to_response('gestor/listado.html',{'lista':lista, 'lista_elegidas':lista_elegidas, 'pj':pj, 'tipo':"arma"}, context_instance=RequestContext(request))

@login_required
def elegir_arma(request, personaje, arma_id):
    if request.user.is_authenticated():
        prop = Jugador.objects.get(jugador=request.user)
        ficha_jugador = FichaAnima.objects.get(propietario=prop, personaje=personaje)
        el_arma = Arma.objects.get(id=arma_id)
        ficha_jugador.armas.add(el_arma)
        ficha_jugador.save()
    return HttpResponseRedirect(reverse('lista_armas', args=[personaje]))

@login_required
def quitar_arma(request, personaje, arma_id):
    if request.user.is_authenticated():
        prop = Jugador.objects.get(jugador=request.user)
        ficha_jugador = FichaAnima.objects.get(propietario=prop, personaje=personaje)
        el_arma = Arma.objects.get(id=arma_id)
        ficha_jugador.armas.remove(el_arma)
        ficha_jugador.save()
    return HttpResponseRedirect(reverse('lista_armas', args=[personaje]))

@login_required
def ver_ficha(request, personaje, jugador=None, extra_context = {}, template_name='gestor/detalle_ficha.html'):
    if not jugador:
        extra_context['jug'] = Jugador.objects.get(jugador=request.user)
        extra_context['ficha'] = FichaAnima.objects.get(propietario=extra_context['jug'], personaje=personaje)
    else:
        usuario = User.objects.get(username=jugador)
        extra_context['jug'] = Jugador.objects.get(jugador=usuario)
        extra_context['ficha'] = FichaAnima.objects.get(propietario=extra_context['jug'], personaje=personaje)
    return render_to_response(template_name,extra_context, context_instance=RequestContext(request))

@login_required
def participacion(request, extra_context={}, template_name='inicial.html'):
    jug = Jugador.objects.get(jugador=request.user)
    if jug.participativo == True:
        jug.participativo = False
    else:
        jug.participativo = True
    jug.save()
    return HttpResponseRedirect(reverse('inicial'))
